結果奮鬥最久的還是處理pptx的資料XD
來反省一下...先看一下簡報的架構(排除了一些跟播放沒直接關係的設定檔),大致上可以分成幾個部分:
資料會從上而下流動,而且各自只擁有部分,所以在產出投影片要使用的資料時,需要從投影片找到他使用的版面配置,從版面配置找到使用的母片、從母片找到使用的佈景主題,然後根據投影片圖形與版面配置圖形的對應關係,把資料串起來。每一層的可能有缺資料或是會覆蓋過上一層的資料...
原本做剖析的程式,是採用邊剖析,邊處理資料相依性的方式。不過後來發現這樣太複雜,而且分工不清楚。後面就做了調整,先把所有資料處理成統一的格是,然後再來彙整出各個投影片。
另外,原本彙整資料時,我會用Object.assign()
來把兩個物件資料整合起來,不過後來發現這樣會有問題,因為其實他只把物件中的參考匯合在一起,這樣原本的資料有變動,也會影響到產生出的物件。更大的問題是,物件底下的物件也需要彙整,這個用Object.assign()
做不到XD,所以隨手寫了一個deepAssign函數,用遞迴的方式彙整物件及子物件。
另外,pptx用timing這個樹狀結構來描述投影片中所有會發生的動作。這個東西有點複雜...做一個最簡單的文字區塊移動,深度就超過20層...因為還不知道怎麼處理比較好,就先寫一個深度優先的walker,把它轉成帶有深度資訊的一維陣列。可能還要花一些時間瞪它,看他會不會告訴我一些秘密...
目前使用的結果是,如果是要用它簡單處理文件可能還好。這一套SDK基本上大約就是XML Schema中定義的型別與類別的定義,另外加上節點尋訪的方法,用Composite Pattern組織起來...基本上跟pptx裡面的xml就是一個一對一的對應,除非已經對Office OpenXML已經夠熟,使用起來還是會有點困難。如果不對照一下ECMA-376文件中的XML Schema定義,光看MSDN也不會知道某個類別底下會有哪些節點。
因為用起來感覺有點雞肋,最後還是直接面對xml,只是把它轉成Javascript物件,然後用node.js來處理。最主要的參考書還是ECMA-376...不過說實話,這個規格書實在太大本,很多說明有點敷衍XD
就是要開始處理timing結構啦...不過沿路還會一直碰到需要支援剖析更多種資料的問題...現在很多作法其實只是欠技術債的開始XD